Linux系统编程--1(进程和程序,CPU和MMU,PCB,进程状态)

进程相关概念

程序和进程

程序:是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu、内存、打开的文件、设备、锁…)
进程:是一个抽象的概念,与操作系统原理联系紧密。进程是活跃的程序(程序员角度),占用系统资源,分配资源的基本单位(操作系统角度)。在内存中执行。(程 序运行起来,产生一个进程)

进程与程序的关系

程序就好像剧本,而进程呢就像一台戏。
同一个剧本可以在多个舞台同时上演。同样,同一个程序也可以加载为不同的进程(彼此之间互不影响)

  1. 程序占用磁盘空间,不占用系统资源
  2. 进程占用系统资源
  3. 程序没有生命周期,进程有生命周期

并发

并发:在操作系统中,一个时间段中有多个进程都处于已启动运行到运行完毕之间的状态。但,任一个时刻点 上仍只有一个进程在运行。
例如,当下,我们使用计算机时可以边听音乐边聊天边上网。 若笼统的将他们均看做一个进程的话,为什么 可以同时运行呢,因为并发。

单道程序设计

所有进程一个一个排对执行。若 A 阻塞,B 只能等待,即使 CPU 处于空闲状态。而在人机交互时阻塞的出现时 必然的。所有这种模型在系统资源利用上及其不合理,在计算机发展历史上存在不久,大部分便被淘汰了。
就是一群人排队,必须等前面人把事情处理完,前面人如果生病了或者突然有事走了,后面人不能办事,必须等前面的人回来办完才能轮到自己

多道程序设计

在计算机内存中同时存放几道相互独立的程序,它们在管理程序控制之下,相互穿插的运行。多道程序设计必 须有硬件基础作为保证。

时钟中断

即为多道程序设计模型的理论基础。 并发时,任意进程在执行期间都不希望放弃 cpu。因此系统需要 一种强制让进程让出 cpu 资源的手段。时钟中断有硬件基础作为保障,对进程而言不可抗拒。 操作系统中的中断
处理函数,来负责调度程序执行。

分时复用

在多道程序设计模型中,多个进程轮流使用 CPU(分时复用 CPU 资源)。而当下常见 CPU 为纳秒级,1 秒可以执 行大约 10 亿条指令。由于人眼的反应速度是毫秒级,所以看似同时在运行。 1s=1000ms,1ms=1000us,1us=1000ns 1000000000
实质上,并发是宏观并行,微观串行!
在这里插入图片描述

CPU和MMU

在这里插入图片描述
硬盘存储容量大,速度慢,磁盘把数据放到内存中,内存按理说可以直接把数据放到cpu中寄存器中去执行,但是为了提高效率,又在中间加了一个缓存Cache(缓冲区),通过Cache进入CPU

进到CPU中并不是整个程序,而是一条一条指令,以二进制形式处理,而从Cache进入CPU处理之前,要先经过预处理,编译,汇编,链接把程序中的每一条指令变为二进制

预取器

从cache中把指令取出来,交给译码器译码

译码器

分析指令干什么,要用什么寄存器

算术逻辑单元(ALU)

执行+,<<运算,所有的运算都是通过+,<<模拟出来。计算完后,把数据给CPU中的寄存器堆。再给缓存

MMU

在这里插入图片描述
两个相同的程序,运行两次,产生两个进程,用户块映射的物理内存不一样(因为进程彼此独立),但内核块映射的区域是一样的,PCB(进程描述符)位于内核空间当中,但是两个进程的PCB不一样,位于同一块物理内存里。

右边是虚拟地址空间,在程序运行时产生,虚拟内存其实不存在,所有的数据实际是放在内存条中,所以存在一个对映的关系,一个1GB的实际内存,如何编写出来4GB的虚拟内存?

虚拟地址,可用地址范围有4GB
例如:0x804a400 int a =10;//此时的地址是虚拟地址,它对应的实际地址是另外一个值
MMU就是帮忙对应虚拟地址和实际地址,也就是映射
另外一个问题,虚拟地址空间中,0~3GB是用户可以使用的大小,而3~4GB是内核空间,内核可以访问用户的空间,但用户访问不了内核的,但是实际内存中,并没有什么用户和内核的划分,所以需要有个东西来制定相应的访问权限的问题。
MMU设置修改内存访问级别的问题

进程描述符PCB

  1. 我们知道,每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息
  2. ,Linux 内核的进程控制块是 task_struct 结构体。
  3. /usr/src/linux-headers-3.16.0-30/include/linux/sched.h 文件中可以查看 structtask_struct 结构体定义。
  4. PCB中的主要成员如下
  • 进程 id。系统中每个进程有唯一的 id,在 C 语言中用 pid_t 类型表示,其实就是一个非负整数。

  • 进程的状态,有就绪、运行、挂起、停止等状态。

  • 进程切换时需要保存和恢复的一些 CPU 寄存器。

      这里说一下,之前说过,CPU分时机制,可以在一个进程突然有事,不能运行的情况下,再运行其他程序,等这个程序可以运行时再再次运行,所以CPU寄存器中就保存了这个程序在离开时的状态,等这个程序再次回来时恢复
    
  • 描述虚拟地址空间的信息。

     虚拟地址与物理地址的对应关系,MMU中使用一张表记录改信息,这张表MMU维护,存储在PCB中
    
  • 描述控制终端的信息。

  • 当前工作目录(CurrentWorkingDirectory)。

  • umask 掩码。 用来保护文件创建或者修改的权限

  • 文件描述符表,包含很多指向 file 结构体的指针。

  • 和信号相关的信息。

  • 用户 id 和组 id。

  • 会话(Session)和进程组。

  • 进程可以使用的资源上限(ResourceLimit) 。

进程状态

进程状态保存在PCB, 进程基本的状态有 5 种。分别为初始态,就绪态,运行态,挂起态与终止态。其中初始态为进程准备阶段,常 与就绪态结合来看。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统编程--2(环境变量,进程控制)

环境变量 环境变量 是指在操作系统中用来指定操作系统运行环境的一些参数 每个人用电脑的习惯不一样&#xff0c;比如一般把文件放到磁盘&#xff0c;怎么管理文件&#xff0c;用什么编译器&#xff0c;所以&#xff0c;环境变量就是根据每个人使用操作系统的习惯来规定一些参…

套接字编程--1(UDP协议编程,端口号,传输层协议,网络字节序)

传输层的协议&#xff1a; ip地址&#xff1a; 在网络中唯一标识一台主机 IPV4&#xff1a;uint32_t DHCP NATIPV6 : uint8_t addr[16] —向前并不兼容IPV4 每一条数据都必须包含源地址和目的地址&#xff1a;因为每条网络中的数据都必须确定是从那个主机来到那个主机去 端…

Linux系统编程--3(exec 函数族,僵尸进程和孤儿进程,wait和wait_pid回收子进程)

exec 函数族 fork 创建子进程后执行的是和父进程相同的程序&#xff08;但有可能执行不同的代码分支&#xff09; &#xff0c;子进程往往要调用一种 exec 函数以执行另一个程序。当进程调用一种 exec 函数时&#xff0c;该进程的用户空间代码和数据完全被新程序替换&#xff…

交换机MAC地址学习和转发数据帧的原理

1 &#xff1a;交换机 MAC 地址学习在交换机初始化的&#xff0c;也就是刚启动的时候&#xff0c;交换机的MAC地址表是没有任何MAC地址和端口的映射条目的 当PCA要想和PCC&#xff0c;PCB,PCD进行通信时&#xff0c;当该二层数据帧通过端口E1/0/1发送到交换机上时&#xff0c…

Linux系统编程---4(进程间通信IPC,管道)

进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享同样的资源。通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了某种事件&#xff08;如进…

冲突域 广播域简单解释

网络互连设备可以将网络划分为不同的冲突域、广播域。但是&#xff0c;由于不同的网络互连设备可能工作在OSI模型的不同层次上。因此&#xff0c;它们划分冲突域、广播域的效果也就各不相同。如中继器工作在物理层&#xff0c;网桥和交换机工作在数据链路层&#xff0c;路由器工…

Linux系统编程---5(共享存储映射,存储映射I/O,mmap函数,父子进程间通信,匿名映射)

共享存储映射 文件进程间通信 使用文件也可以完成 IPC&#xff0c;理论依据是&#xff0c;fork 后&#xff0c;父子进程共享文件描述符。也就共享打开的文件。 编程&#xff1a;父子进程共享打开的文件。借助文件进行进程间通信。 测试代码 /*** 父子进程共享打开的文件描述…

变量的存取

一、预备知识―程序的内存分配 一个由c/C编译的程序占用的内存分为以下几个部分 1、栈区&#xff08;stack&#xff09;― 由编译器自动分配释放 &#xff0c;存放函数的参数值&#xff0c;局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区&#xff08;heap&#xff…

Linux系统编程---6(信号的机制,信号4要素,Linu常规信号表,定时器)

信号的概念 信号在我们的生活中随处可见&#xff0c; 如&#xff1a;古代战争中摔杯为号&#xff1b;现代战争中的信号弹&#xff1b;体育比赛中使用的信号枪… 他们都有共性&#xff1a; 简单不能携带大量信息&#xff0c;只能带一个标志。满足某个特设条件才发送。 Unix 早…

Linux系统编程----7(信号集,信号屏蔽,信号捕捉)

信号集操作函数 内核通过读取未决信号集来判断信号是否应被处理。信号屏蔽字 mask 可以影响未决信号集。而我们可以在应 用程序中自定义 set 来改变 mask。已达到屏蔽指定信号的目的。 信号集设定 sigset_t set; //typedef unsigned long sigset_t;int sigemptyset(sigset_t…

Linux系统编程---8(全局变量异步I/O,可重入函数)

全局变量异步 I/O 分析如下父子进程交替 数数 程序。当捕捉函数里面的 sleep 取消&#xff0c;程序即会出现问题。请分析原因。 #include<stdio.h> #include<signal.h> #include<unistd.h> #include<stdlib.h>intn0,flag0; void sys_err(char* s…

http使用post上传文件时,请求头和主体信息总结

请求头必须配置如下行&#xff1a; Content-Type : multipart/form-data; boundary---12321 boundary---12321位文件的分界线 body如下&#xff1a; "-----12321\r\n" //分割文件时加-- "Content-Disposition: form-data; name\"…

Linu系统编程---9(SIGCHLD 信号,信号传参,中断系统调用)

SIGCHLD 信号 SIGCHLD 的产生条件 子进程终止时子进程接收到 SIGSTOP 信号停止时子进程处在停止态&#xff0c;接受到 SIGCONT 后唤醒时 借助 SIGCHLD 信号回收子进程 子进程结束运行&#xff0c;其父进程会收到 SIGCHLD 信号。该信号的默认处理动作是忽略。可以捕捉该信号…

Linu系统编程---10(Linux的终端,线路规程,网络终端,进程组)

终端 输入输出设备的总称 在 UNIX 系统中&#xff0c;用户通过终端登录系统后得到一个 Shell 进程&#xff0c;这个终端成为 Shell 进程的控制终端&#xff08;Controlling Terminal&#xff09;&#xff0c; 进程中&#xff0c;控制终端是保存在 PCB 中的信息&#xff0c;而 …

Linux系统编程---11(会话,守护进程,创建守护进程)

会话 创建会话 创建一个会话需要注意以下6点注意事项 调用进程不能是进程组组长&#xff0c;该进程变成新会话首进程该进程成为一个新进程组的组长进程需要root权限&#xff08;nbuntu不需要&#xff09;新会话丢弃原有的控制终端&#xff0c;该会话没有控制终端该调用进程是…

Linux系统编程----12(线程概念,Linux线程实现原理,栈中ebp指针和ebp指针,线程的优缺点和共享资源)

线程概念 什么是线程 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列” 一切进程至少都有一个执行线程线程在进程内部运行&#xff0c;本质是在进程地址空间内运行在Linux系统中&#xff0…

Linux系统编程---13(线程控制函数,创建线程,循环创建多个线程,线程间共享全局变量)

线程控制 操作系统并没有提供创建线程的系统调用接口&#xff0c;因此大佬们封装了一个线程的接口库实现线程控制。意为着用户创建线程都使用的是库函数&#xff08;所以有时候我们说创建的线程是一个用户态线程&#xff0c;但是在内核中对应有一个轻量级进程实现线程程序的调…

Linux系统编程---14(回收子线程,回收多个子线程,线程分离,杀死线程)

回收子线程 pthread_join 函数 阻塞等待线程退出&#xff0c;获取线程退出状态 其作用&#xff0c;对应进程中 waitpid() 函数。 int pthread_join (pthread_t thread,void** retval); 成功&#xff1a;0&#xff0c;失败&#xff1a;错误号 参数&#xff1a;thread&#x…

Linux系统编程----15(线程与进程函数之间的对比,线程属性及其函数,线程属性控制流程,线程使用注意事项,线程库)

对比 进程 线程 fork pthread_create exit (10) pthread_exit &#xff08;void *&#xff09; wait (int *) pthread_join &#xff08;&#xff0c;void **&#xff09;阻塞 kill pthread_cancel ();必须到取消点&#xff08;检查点&#xff09;&#xff1a;…

Linux系统编程----16(线程同步,互斥量 mutex,互斥锁的相关函数,死锁,读写锁)

同步概念 所谓同步&#xff0c;即同时起步&#xff0c;协调一致。不同的对象&#xff0c;对“同步”的理解方式略有不同。如&#xff0c;设备同步&#xff0c;是指在两 个设备之间规定一个共同的时间参考&#xff1b;数据库同步&#xff0c;是指让两个或多个数据库内容保持一致…