【Linux】进程概念一

简介: 【Linux】进程概念一

进程概念一

冯诺依曼体系结构

我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。

截止目前为止, 我们所认识的计算机,都是一个个的硬件组成

  • 输入设备:包括键盘,鼠标,网卡,磁盘,话筒
  • 输出设备:显示器,磁盘,网卡,声卡,音响

输入设备,输出设备称之为外围设备,外围设备一般都比较慢一些,以磁盘为例相对于内存,磁盘是比较慢的。

这里我们可以思考一下,为什么不设计如下图所示的样子呢?

这里我们可以想到木桶原理,外设的效率非常低,但是CPU效率很高,整体效率就是以外设为主的。

所以因为有了内存的存在,我们可以对数据进行预加载,CPU以后在进行数据计算的时候,根本不需要访问外设了,而是直接访问内存就可以了。

但是这里我们怎么知道哪些内容需要预加载进CPU当中,通过大量的测试发现,预加载的内容一般都是加载内容旁边的内容。

关于冯诺依曼体系的几点

  • 这里的存储器指的是内存
  • 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入设备或输出设备)
  • 外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存读取
  • 所有的外围设备只能和内存打交道

理解:可执行程序是不是一个文件?是 -> 磁盘 -> 外设。必须先加载到内存中。

在硬件层面单机和跨机之间数据是如何流向的。

你和朋友,聊qq,你发送了一个在吗?整个信息如何在体系结构中流动的

结论:

  1. 在数据层面,一般CPU不和外设直接沟通,而是直接和内存打交道
  1. 外设只会和内存打交道

操作系统

概念

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

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

设计OS的目的

  • 与硬件交互,管理所有的软硬件资源
  • 为用户程序(应用程序)提供一个良好的执行环境

操作系统为什么对软硬件资源进行管理呢?

操作系统对下通过管理好软硬件资源(手段),对上给用户提供(安全、稳定、高效、功能丰富等)执行环境(目的)

定位

在整个计算机软硬件架构中,操作系统的定位是:一款纯正的“搞管理”的软件

操作系统,一款进行软硬件资源管理的软件

如何理解“管理”

  • 管理者和被管理者是不需要直接沟通的。对管理做建模
  • 管理的本质:对被管理对象的数据做管理

管理的本质:先描述,在组织

操作系统给我们提供良好的服务,并不代表操作系统相信我们,反而操作系统不相信任何人!

我们并不能进入操作系统来随心所欲的访问数据。

系统调用接口,其实就是操作系统设计的C函数,这里的操作系统就像银行的柜台一样,我们只能去做规定的操作。

系统调用和库函数概念

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

承上启下

那在还没有学习进程之前,操作系统是怎样进行进程管理的呢?很简单,先把进程描述起来,再把进程组织起来!

进程

基本概念

  • 课本概念:程序的一个实例,正在执行的程序等
  • 内核观点:担当分配系统资源(CPU时间,内存)的实体

什么是进程?内核关于进程的相关数据结构和当前进程的代码和数据

描述进程-PCB

  • 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合
  • 课本上称之为PCBLinux操作系统下的PCB是:task_struct
task_struct-PCB的一种
  • Linux当中描述进程的结构叫做task_struct
  • task_structLinux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息
task_struct内容分类
  • 标识符:描述进程的唯一标识符,用来区别其他进程
  • 状态:任务状态,退出代码,退出信号灯
  • 优先级:相对于其他进程的优先级
  • 程序计数器:程序中即将被执行的下一条指令的地址
  • 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  • 上下文数据:进程执行时处理器的寄存器中的数据
  • I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
  • 记账信息:可能包括处理器时间总和,使用的时钟总和,时间限制,记账号等

组织进程

可以在内核源码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。

查看进程

  1. 进程的信息可以通过/proc系统文件夹查看

如果需要查看pid为1的进程可以通过这种手段来查看

/proc/1

  1. 大多数信息可以通过topps这些用户工具来获取

如下代码:

我们可以通过这个代码来查看有关这个进程的信息。

ps ajx | grep test | grep -v grep

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

  • 进程id(PID)
  • 父进程id (PPID)

bash本质上也是一个进程

命令行启动的所有程序,最终都会变成进程,而该进程对应的父进程都是bash

如何创建子进程的呢?

  1. fork之后,执行流会变成2个执行流
  2. fork之后,谁先运行由调度器决定
  1. forkfork之后的代码共享,通常通过ifelse if来进行执行流分流

通过系统调用创建进程fork

关于fork介绍

  1. 在父进程当中fork会返回新创建子进程的id
  2. 在子进程当中fork会返回0
  1. 如果出现错误,返回一个负值
  • fork会有两个返回值
  • 父子进程共享代码,数据各自开辟空间,私有一份(采用临时拷贝)
  • fork通过用if来分流

使用例子:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
  int ret = fork();
  if (ret < 0) {
    perror("fork");
    return 1;
  }
  else if (ret == 0) { //child
    printf("I am child : %d!, ret: %d\n", getpid(), ret);
  }
  else { //father
    printf("I am father : %d!, ret: %d\n", getpid(), ret);
  }
  sleep(1);
  return 0;
}

进程在运行的时候,是具有独立性的!父子进程,运行的时候,也是一样的都是具有独立性的


进程 = 内核数据结构 + 进程的代码和数据


数据:当有一个执行流尝试修改数据的时候,操作系统会自动给我们当前进程触发写时拷贝


fork如何理解两个返回值的问题?


fork本质是操作系统提供的一个函数,当这个函数执行的时候会创建出一个执行流,此时就会有两个执行流,然后就会有两条return语句。


相关文章
|
16天前
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
3月前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
132 1
|
1月前
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
77 34
|
12天前
|
Linux
Linux:守护进程(进程组、会话和守护进程)
守护进程在 Linux 系统中扮演着重要角色,通过后台执行关键任务和服务,确保系统的稳定运行。理解进程组和会话的概念,是正确创建和管理守护进程的基础。使用现代的 `systemd` 或传统的 `init.d` 方法,可以有效地管理守护进程,提升系统的可靠性和可维护性。希望本文能帮助读者深入理解并掌握 Linux 守护进程的相关知识。
27 7
|
11天前
|
Linux Shell
Linux 进程前台后台切换与作业控制
进程前台/后台切换及作业控制简介: 在 Shell 中,启动的程序默认为前台进程,会占用终端直到执行完毕。例如,执行 `./shella.sh` 时,终端会被占用。为避免不便,可将命令放到后台运行,如 `./shella.sh &`,此时终端命令行立即返回,可继续输入其他命令。 常用作业控制命令: - `fg %1`:将后台作业切换到前台。 - `Ctrl + Z`:暂停前台作业并放到后台。 - `bg %1`:让暂停的后台作业继续执行。 - `kill %1`:终止后台作业。 优先级调整:
32 5
|
11天前
|
Linux 应用服务中间件 nginx
Linux 进程管理基础
Linux 进程是操作系统中运行程序的实例,彼此隔离以确保安全性和稳定性。常用命令查看和管理进程:`ps` 显示当前终端会话相关进程;`ps aux` 和 `ps -ef` 显示所有进程信息;`ps -u username` 查看特定用户进程;`ps -e | grep &lt;进程名&gt;` 查找特定进程;`ps -p &lt;PID&gt;` 查看指定 PID 的进程详情。终止进程可用 `kill &lt;PID&gt;` 或 `pkill &lt;进程名&gt;`,强制终止加 `-9` 选项。
20 3
|
11天前
|
存储 算法 数据处理
进程基础:概念、状态与生命周期
进程是操作系统进行资源分配和调度的基本单位,由程序段、数据段和进程控制块(PCB)组成。线程是进程中更小的执行单元,能独立运行且共享进程资源,具有轻量级和并发性特点。进程状态包括就绪、运行和阻塞,其生命周期分为创建、就绪、运行、阻塞和终止阶段。
50 2
|
1月前
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
68 16
|
2月前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
185 20
|
4月前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
582 58