目录
🍃1. 冯诺依曼体系结构
- 概念
- 体系结构
我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系.
我们所认识的计算机,都是有一个个的硬件组件组成:
注意
- 数据流向
我们先看一下计算机的存储分级:
通过这个图,我们可以理解为什么计算机的数据流向是固定的:
- 实例
🍃2. 操作系统
- 概念
何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
- 设计OS的目的
- 计算机体系
注意
- 系统调用和库函数概念
- 管理
那在还没有学习进程之前,就问大家,操作系统是怎么管理进行进程管理的呢?很简单,先把进程描述起来,再把进程组织起来!
用学校来举例:
🍃3. 进程
- 基本概念:
- 描述进程-PCB
说明:
- task_ struct内容分类
🍃4. 查看进程
- 关闭进程
- 以文件形式查看进程 ——
/proc
是Linux系统下查看进程的目录
ls /proc
ls /proc/pid
ll /proc/pid
🍃5. 创建子进程fork
- 什么是fork
- 使用 fork 创建进程
- 理解fork
在上面的代码中,我们发现一个程序有两个返回值,我们来进一步理解
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
void DoThing()
{
int count = 0;
while(count < 5)
{
printf("pid : %d, ppid : %d, count : %d\n", getpid(), getppid(), count);
count++;
sleep(1);
}
}
int main()
{
pid_t ids[5];
printf("I am father : %d\n", getpid());
for(int i = 0; i < 5; i++)
{
ids[i] = fork();
if(ids[i] == 0)
{
//child
DoThing();
exit(1);
}
}
printf("%d %d %d %d %d\n", ids[0], ids[1], ids[2], ids[3], ids[4]);
getchar();
return 0;
}
🍃6. 进程状态
- 什么是进程状态
- 进程状态
/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char *task_state_array[] = {
"R (running)", /* 0*/
"S (sleeping)", /* 1*/
"D (disk sleep)", /* 2*/
"T (stopped)", /* 4*/
"T (tracing stop)", /* 8*/
"Z (zombie)", /* 16*/
"X (dead)" /* 32*/
};
进程变迁图:
- 查看进程
ps aux
ps axj
R运行状态(running)
查看运行状态:
#include<iostream>
#include<sys/types.h>
#include<unistd.h>
int main()
{
while(true);
return 0;
}
S 浅度睡眠状态(sleeping)
查看运行状态:
#include<stdio.h>
#include<unitsd.h>
int main()
{
sleep(100) ; //睡眠100秒
return 0;
}
挂起状态(也属于S 状态)
- D 深度睡眠状态(Disk sleep)
T暂停状态(stopped)
我们先看看kill指令:
暂停进程
那要怎么样才能暂停呢?
X死亡状态(dead)
Z僵尸状态(Zombie)
🌿6.1 僵尸进程
写一个监控命令行脚本,语法类似C语言:
while :; do ps axj | head -1 && ps axj | grep practice | grep -v grep; sleep 1; echo "########################"; done
1 #include <stdio.h>
2 #include <unistd.h>
3
4 int main()
5 {
6 pid_t id = fork();
7 if(id == 0)
8 {
9 //child
10 while(1)
11 {
12 printf("I am a child, running!\n");
13 sleep(2);
14 }
15 }
16 else
17 {
18 //parent
19 printf( "father do nothing!\n");
20 sleep(50);
21 }
22 return 0;
23 }
- 僵尸进程危害
🌿6.2 孤儿进程
代码演示:
#include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4
5 int main()
6 {
7 pid_t id = fork();
8 if(id == 0)
9 {
10 //child
11 while(1)
12 {
13 printf("I am a child, running!\n");
14 sleep(2);
15 }
16 }
17 else
18 {
19 //parent
20 printf( "father do nothing!\n");
21 sleep(10);
22 exit(1);
23 }
24 return 0;
25 }
🍃7. 进程优先级
- 基本概念
- 查看优先级
ps -l
我们很容易注意到其中的几个重要信息,有下:
UID:
- PRI and NI
- PRI vs NI
🌿 调整优先级
- 调整优先级:
top
进入top后按"r" → 输入进程PID → 输入nice值
PRI的默认值是80
进入top
按r,输入PID值
输入nice值,然后按q退出
此时我们再用ps命令查看进程的优先级信息,即可发现进程的NI变成了10,PRI变成了90(80+NI)。
注意:若是想将NI值调为负值,也就是将进程的优先级调高,需要使用sudo命令提升权限。
- 四个重要概念
🍃8 . 环境变量
- 基本概念:
🌿 常见环境变量
- 查看环境变量的方法
我们可以通过echo命令来查看环境变量,方式如下:
echo $NAME //NAME为待查看的环境变量名称
查看环境变量PATH
echo $PATH
测试PATH
创建文件
#include <stdio.h>
int main()
{
printf("hello world!\n");
return 0;
}
- 解决方法
测试HOME
普通用户
超级用户
🌿 环境变量相关的命令
echo | 显示某个环境变量值 |
---|---|
export | 设置一个新的环境变量 |
env | 显示所有环境变量 |
unset | 清除环境变量 |
set | 显示本地定义的shell变量和环境变量 |
- 环境变量的组织方式
🌿 通过代码如何获取环境变量
方法一:命令行第三个参数
#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{
int i = 0;
for(; env[i]; i++){
printf("%s\n", env[i]);
}
return 0;
}
运行结果就是各个环境变量的值:
方法二:通过第三方变量environ来获取。
#include <stdio.h>
int main(int argc, char *argv[])
{
extern char **environ;
int i = 0;
for(; environ[i]; i++){
printf("%s\n", environ[i]);
}
return 0;
}
🌿 通过系统调用获取环境变量
例如,使用getenv函数获取环境变量PATH的值。