ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【Linux】历程概念 [打印本页]

作者: 去皮卡多    时间: 2024-9-19 18:14
标题: 【Linux】历程概念
1. 冯诺依曼体系布局

外设:

cpu/中央处理器:

输入装备、输出装备、运算器、控制器、内存都是独立的个体。各个硬件单位必须用“线”链接起来(“线”即总线,包罗体系总线和I0总线)
盘算机存储金字塔:

2. 操纵体系

2.1 概念

任何盘算机体系都包罗一个基本的程序聚集,称为操纵体系(OS)。笼统的理解,操纵体系包罗:
   
  2.2 设计OS的目标

   
  2.3 定位

在整个盘算机软硬件架构中,操纵体系的定位是:一款纯正的“搞管理”的软件
2.4 如何进行 “管理”


2.5 操纵体系管理硬件


2.6 体系调用和库函数概念


3. 历程

3.1 基本概念


3.2 PCB


3.3 task_ struct内容分类


3.4 操纵体系对历程的管理


3.5 组织历程

可以在内核源代码里找到它。所有运行在体系里的历程都以task_struct链表的情势存在内核里
3.6 检察历程



竣事历程:
  1. # kill -9  XXX   // XXX:进程对应的PID
复制代码
3.7 通过体系调用获取历程标示符


  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. int main()
  5. {
  6. printf("pid: %d\n", getpid());
  7. printf("ppid: %d\n", getppid());
  8. return 0;
  9. }
复制代码
3.8通过体系调用创建历程-fork初识

fork:通过体系调用函数,让父历程创建子历程
fork函数返回值:
如果乐成,给父历程返回子历程的PID,0返回给子历程,此时返回值有两个
如果失败,给父历程返回-1,不返回给子历程
fork 之后通常要用 if 进行分流:
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. int main()
  5. {
  6. printf("begin: 我是一个进程,pid: %d!, ppid: %d\n", getpid(), getppid());
  7. int ret = fork();
  8. if(ret < 0)
  9. {
  10. perror("fork");
  11. return 1;
  12. }
  13. else if(ret == 0)  //child
  14. {
  15. printf("我是子进程,pid: %d!, ppid: %d\n", getpid(), getppid());
  16. }
  17. else   //father
  18. {
  19. printf("我是父进程 : %d!, ret: %d\n", getpid(), getppid());
  20. }
  21. sleep(1);
  22. return 0;
  23. }
复制代码
代码实行结果:

返回不同的返回值,是为了区分让不同的实行流,实行不同的代码块! 一样平常而言fork代码及fork之后的代码父子共享。给父历程返回子历程pid是为了让父历程区别子历程。

为了让父和子实行不同的事情!------需要想办法让父和子实行不同的代码块
让fork具有了不同的返回值!-------区别父子历程
谁先运行,由调治器决定,不确定的
因为fork代码及fork之后的代码父子共享,以是 fork 函数被父子历程实行了两次,以是有两个返回值。而且ret是父历程的数据,子历程无法修改,当子历程调用函数后,再赋值给 ret 时,发生了深拷贝,新空间也有一个变量,叫做 ret,以是是同一变量名,不同空间。

4. 历程状态

  1. /*
  2. * The task state array is a strange "bitmap" of
  3. * reasons to sleep. Thus "running" is zero, and
  4. * you can test for combinations of others with
  5. * simple bit tests.
  6. */
  7. static const char * const task_state_array[] = {
  8. "R (running)", /* 0 */
  9. "S (sleeping)", /* 1 */
  10. "D (disk sleep)", /* 2 */
  11. "T (stopped)", /* 4 */
  12. "t (tracing stop)", /* 8 */
  13. "X (dead)", /* 16 */
  14. "Z (zombie)", /* 32 */
  15. };
复制代码


4.1 Z(zombie)-僵尸历程


4.2 僵尸历程的危害


4.3 孤儿历程


5. 历程优先级

基础概念:

5.1 检察体系历程

在linux或者unix体系中,用ps –l命令则会类似输出以下几个内容:

我们很容易注意到其中的几个重要信息,有下:

5.2 PRI and NI


5.3 其他概念


5.3.1 历程切换------>并发

历程切换就是从正在运行的历程中,收回CPU的使用权利,交给下一个要运行的历程。
通过历程切换,从而实现并发。
我们先相识一下寄存器:

历程切换:

6. 环境变量

6.1 基本概念


6.2 常见环境变量


6.3 和环境变量相关的命令

  1. echo $NAME //NAME:你的环境变量名称    不加$的话,echo把NAME当作字符串,直接打印NAME
复制代码
  1. //直接设置环境变量
  2. export XL=123456 //设置的环境变量名称为XL,环境变量值为:123456
  3. //将本地变量转化为环境变量
  4. a=3           //设置本地变量
  5. export a      
复制代码
  1. unset NAME //NAME:你的环境变量名称
复制代码
6.4 环境表

每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串

6.5 通过代码如何获取环境变量


  1. #include <stdio.h>
  2. int main(int argc, char *argv[], char *env[])
  3. {
  4. int i = 0;
  5. for(; env[i]; i++){
  6. printf("%s\n", env[i]);
  7. }
  8. return 0;
  9. }
复制代码

  1. #include <stdio.h>
  2. int main(int argc, char *argv[])
  3. {
  4. extern char **environ;
  5. int i = 0;
  6. for(; environ[i]; i++){
  7. printf("%s\n", environ[i]);
  8. }
  9. return 0;
  10. }
复制代码
libc中界说的全局变量environ指向环境变量表,environ没有包罗在任何头文件中,以是在使用时 要用extern声明。
6.6 通过体系调用获取或设置环境变量


  1. getenv("NAME");  //NAME:环境变量名称   返回值为环境变量的值
复制代码

6.7 当地变量 && 内建命令


7. 程序地址空间


7.1 内存管理和历程管理


我们可以看到的所有地址都是虚拟地址,平时写的C/C++,用的指针,指针内里的地址,全部都不是物理地址。
7.2 子历程的历程管理与内存管理



7.3 页表

什么是页表?
页表是一种数据布局,用于管理虚拟内存和物理内存之间的映射关系。在操纵体系中,当一个程序需要访问内存时,它会先访问虚拟内存,然后再通过页表将虚拟地址映射到物理内存中的实际地址。
页表的作用是什么?
页表地址:
页表地址也属于历程上下文,历程运行时,被放在了寄存器了。
7.4 大文件的惰性加载


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4