Linux——进程概念

1.冯诺依曼体系结构

我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
在这里插入图片描述

  • 输入设备:键盘,网卡,鼠标,摄像头,麦克风,硬盘…
  • 输出设备:显示器,声卡,喇叭,网卡,硬盘…
  • 输入输出设备(外围设备)
  • 内存:掉电易失性存储介质
    在这里插入图片描述

1.越靠近 CPU 速度越快,容量越小,价格越贵。
2.每一种存储器设备只和它相邻的存储设备打交道

在认识层面上,可以认为内存整体是外设和cpu的"缓存",程序运行时内存对数据进行了预加载,把程序缓存起来了。

关于冯诺依曼,必须强调几点:

1.这里的存储器指的是内存
2.不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
3.外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
4.一句话,所有设备都只能直接和内存打交道

2.操作系统

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:

  1. 内核(进程管理,内存管理,文件管理,驱动管理)
  2. 其他程序(例如函数库,shell程序等等)

1.操作系统是什么? :操作系统是一个搞管理的软件,做软硬件管理的。

2.如何理解管理?

  • 真正的管理是要有决策权,区分决策权和执行权。
    在这里插入图片描述
    3.操作系统如何管理: 先描述,在组织
  1. 描述起来,用struct结构体。(Linux下的代码基本都是C语言写的,所以描述一个对象的时候,使用的都是struct所定义出来的。)
  2. 组织起来,用链表,二叉树或者其他更高效的数据结构。(数据结构表示了数据的组织方式)

2.1系统调用和库函数概念:

在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。

库函数vs系统调用: 具有上下级的关系, 库函数(用户级别的库) 可能调用系统调用的接口。

4.为什么有操作系统?
在一套系统中,需要有管理者进行统筹。对上,给用户一个稳定高效的执行环境。
对下,管理好软硬件资源,提供稳定的软硬件环境。

3.进程

3.1基本概念

进程 = 对应的文件+进程属性

进程:可执行程序与管理进程需要的数据结构的集合。
在这里插入图片描述

3.2描述进程-PCB(Process control block)

系统允许多个进程同时运行,OS需要对进程进行管理,如何管理进程?

  • 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
  • 课本上称之为PCB(process control block), Linux操作系统下的PCB是: task_struct

task_struct是PCB的一种:

  1. 在Linux中描述进程的结构体叫做task_struct。
  2. task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。

task_ struct内容分类:

  1. 标示符: 描述本进程的唯一标示符,用来区别其他进程。(pid)
  2. 状态: 任务状态,退出代码,退出信号等。
  3. 优先级: 相对于其他进程的优先级。
  4. 程序计数器: 程序中即将被执行的下一条指令的地址。
  5. 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  6. 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
  7. I/ O状态信息: 包括显示的I/O请求,分配给进程的I/ O设备和被进程使用的文件列表。
  8. 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
    其他信息

3.3查看进程

进程的信息可以通过ls /proc 系统文件夹查看
在这里插入图片描述

ps aux | grep mybin //查看进程信息

这个20592为这个进程的PID(相当于一个身份编号,且这个编号会随着程序的结束而消失,下一次在运行这个可执行程序的时候,PID编号也会随之改变)

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
	while(1){
	sleep(1);
}
	return 0;
}

在这里插入图片描述

3.4通过系统调用获取进程标示符

  • 进程id(PID)
  • 父进程id(PPID)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
	printf("pid: %d\n", getpid());
	printf("ppid: %d\n", getppid());
	return 0;
}

在这里插入图片描述
可执行程序每关闭一次,前面的编号就会变,父进程不会变。

父进程创建子进程->子进程完成基本命令->进程是具有独立性的。

在这里插入图片描述
bash运行原理:bash是命令解释器,通过创建子进程去完成任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值