资讯详情

Linux 计算机基础概论

复习前面的内容 补充上一篇文章的内容,可以点击目录直接进行计算机基础概论

目录

  • 复习上节
    • main.c
    • test.c
  • 主函数
    • main.c
    • main.c进阶
  • printf()
    • sleep(man 3 sleep)
  • 计算机基础概论
    • 1.计算机的基本组成
      • 1.1 五个部件由计算机组成
      • 1.2 系统总线
      • 1.3 指令
    • 2.进程概论
    • 3.内存管理
      • 3.1 简单分页 逻辑页 物理页 页表
      • 3.2 虚拟内存
    • 4.操作系统发展史
  • Linux 复制和替换过程
    • 复制进程 fork
      • fork 方法
      • fork.c

复习上节

main.c

#include<stdio.h> #include<math.h>  int main() { 
             double d=4.0;     double r=sqrt(d);      printf("r=%.2f\n",r);      return 0; } 

用到了sqrt函数(-l库名)

gcc -o main main.c -lm 

ldd main查看使用的库,man sqrt查看sqrt

ldd main man sqrt 

test.c

#include<stdio.h> #include<math.h>  int main() { 
             double d=4.0;     double r=d*2.0;      printf("r=%.2f\n",r);      return 0; } 

编译时直接

gcc -o test test.c 

主函数

main.c

#include<stdio.>
#include<stdlib.h>

//主函数的参数:argc 参数个数,参数内容,环境变量
int main(int argc,char* argv[],char* envp[])
{ 
        
    printf("argc=%d\n",argc);
    for(int i=0;i<argc;i++)
    { 
        
        printf("argv[%d]=%s\n",i,argv[i]);
    }

    return 0;
}

编译

stu@stu-virtual-machine:~/Linux/day07$ gcc -o main main.c
stu@stu-virtual-machine:~/Linux/day07$ ./main
argc=1
argv[0]=./main
stu@stu-virtual-machine:~/Linux/day07$ ./main "hello" abc 123
argc=4
argv[0]=./main
argv[1]=hello
argv[2]=abc
argv[3]=123

打印环境变量path

法一
stu@stu-virtual-machine:~/Linux/day07$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
法二
stu@stu-virtual-machine:~/Linux/day07$ printf $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

main.c进阶

for循环打印环境变量

#include<stdio.h>
#include<stdlib.h>

//主函数的参数:argc 参数个数,参数内容,环境变量
int main(int argc,char* argv[],char* envp[])
{ 
        
    printf("argc=%d\n",argc);
    for(int i=0;i<argc;i++)
    { 
        
        printf("argv[%d]=%s\n",i,argv[i]);
    }

    for(int i=0;envp[i]!=NULL;i++)
    { 
        
        printf("envp[%d]=%s\n",i,envp[i]);
    }
    return 0;
}

加环境变量

stu@stu-virtual-machine:~/Linux/day07$ MYSTR="hello"
stu@stu-virtual-machine:~/Linux/day07$ ./main
argc=1
argv[0]=./main
envp[0]=SHELL=/bin/bash
 ......
envp[52]=OLDPWD=/home/stu/Linux
stu@stu-virtual-machine:~/Linux/day07$ export MYSTR
stu@stu-virtual-machine:~/Linux/day07$ ./main
argc=1
argv[0]=./main
envp[0]=SHELL=/bin/bash
.......
envp[30]=MYSTR=hello
......
envp[53]=_=./main

printf()

Linux常用exit(0)表示正常退出程序(man 3 exit)

sleep(man 3 sleep)

程序阻塞3s

终端:sleep 3

main中:sleep(3)

#include<unistd.h>

先打印hello,再阻塞3s

int main()
{ 
        
    printf("hello\n");
    sleep(3);
    exit(0);//退出进程
}

先阻塞3s,再打印hello

原因:hello还在缓冲区

int main()
{ 
        
    printf("hello");
    sleep(3);
    exit(0);//退出进程
}

1.强制刷新: \n fflush(stdout)

2.放满了

3.程序结束了 exit(0) 注:_exit(0)不打印

计算机基础概论

1.计算机的基本组成

1.1 计算机组成五大部件

(1) 运算器 :也叫算数逻辑单元,完成对数据的各种常规运算,如加减乘除,也包括逻辑运算,移位,比较等。

(2) 控制器 :它是整个计算机系统的控制中心,它指挥计算机各部分协调地工作,保证计算机按照预先规定的目标和步骤有条不紊地进行操作及处理。

(3) 存储器 :存储程序和各种数据。

(4) 输入设备 :把人所熟悉的信息如,图片,声音,文字,转换为计算机能够识别的信息存储起来。

(5) 输出设备 : 把计算机机能识别的信息转换为人能识别的信息,进行呈现。

一台计算机可以抽象成下图:

CPU 中包含控制器和运算器, 内存就是存储器。I/O 设备就是输入设备和输出设备,如:键盘显示器、鼠标、硬盘、网卡

image-20211129211804201

1.2 系统总线

(1) 数据总线 :用来在各个功能部件中间传输数据,是双向传输总线。

(2) 地址总线 : 用来指出数据总线上的源数据或目的数据在主存单元的地址或 io 设备的地址。

(3) 控制总线 :由于各个连接在数据总线和地址总线的部件都是共享这两类总线的,那么在某一时刻由谁来使用,就是控制总线负责完成的。

1.3 指令

(1) 指令 :是指示计算机执行某种操作的命令。一条指令通常由两部分构成:地址码 和 操作码。

(2) 程序 : 由一条一条的指令构成。

(3) 指令周期 :cpu 每取出并执行一条指令所需的全部时间称为指令周期。

(4) 指令系统 :计算机能够执行的全部指令的集合称为该计算机的指令系统。

(5) RISC :精简指令系统计算机。

(6) CISC :复杂指令系统计算机。

(7) 程序与指令:高级语言 汇编助记符 机器指令

2.进程概论

(1) 进程:一个正在运行的程序。

(2) PCB : 即是进程控制块,是进程存在的唯一标志。用来描述进程的属性信息。

(3) 进程状态: 就绪 、运行、阻塞

(4) 并发与并行

并行:是指两个或者多个事件在同一时刻发生

并发:是指两个或多个事件在同一时间间隔发生

3.内存管理

3.1 简单分页 逻辑页 物理页 页表

页表存放逻辑页与物理页的对应关系

平时打印的地址是逻辑地址

磁盘 -> 内存 ->缓存 ->寄存器

空间大 速度快

3.2 虚拟内存

虚拟内存提供的三个重要的能力:

1) 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,根据需要在磁盘和主存之间来回传送数据,使得能够运行比内存大的多的进程。

2) 它为每个进程提供了一致的地址空间,从而简化了存储器管理

3) 它保护每个进程的地址空间不被其他进程破坏

4.操作系统发展史

操作系统:管理计算机上的软硬件资源,为用户提供一个交互的接口。

(1) 串行处理

(2) 批处理

(3) 多道程序设计

(4) 分时系统

Linux 进程复制与替换

复制进程 fork

fork 方法

#include<unistd.h>
pid_t fork(void); 

函数返回类型 pid_t 实质是 int 类型,Linux 内核 2.4.0 版本的定义是: fork 函数会新生成一个进程,调用 fork 函数的进程为父进程,新生成的进程为子进程。 pid_t pid的值 在父进程中返回子进程的 pid,在子进程中返回 0,失败返回-1。

fork.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>

int main()
{ 
        
    int n=0;
    char *s=NULL;

    pid_t id=fork();
    
    if(id==0)
    { 
        
        n=3;
        s="child";
    }
    else
    { 
        
        n=7;
        s="parent";
    }

    for(int i=0;i<n;i++)
    { 
        
        printf("s=%s\n",s);
        sleep(1);
    }

    exit(0);
}

结果

s=parent
s=child
s=child
s=parent
s=child
s=parent
s=parent
s=parent
s=parent
s=parent

fork.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>

int main()
{ 
        
    int n=0;
    char *s=NULL;

    pid_t id=fork();
    
    if(id==0)
    { 
        
        n=3;
        s="child";
    }
    else
    { 
        
        n=7;
        s="parent";
    }

    for(int i=0;i<n;i++)
    { 
        
        printf("s=%s,pid=%d,ppid=%d\n",s,getpid(),getppid());
        sleep(1);
    }

    exit(0);
}

结果

stu@stu-virtual-machine:~/Linux/day07$ ./fork
s=parent,pid=3465,ppid=3023
s=child,pid=3466,ppid=3465
s=child,pid=3466,ppid=3465
s=parent,pid=3465,ppid=3023
s=parent,pid=3465,ppid=3023
s=child,pid=3466,ppid=3465
s=parent,pid=3465,ppid=3023
s=parent,pid=3465,ppid=3023
s=parent,pid=3465,ppid=3023
s=parent,pid=3465,ppid=3023
stu@stu-virtual-machine:~/Linux/day07$ ps -f
UID          PID    PPID  C STIME TTY          TIME CMD
stu         3023    2218  0 20:35 pts/1    00:00:00 bash
stu         3467    3023  0 22:31 pts/1    00:00:00 ps -f

fork.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>

int main()
{ 
        
    int n=0;
    char *s=NULL;

    pid_t id=fork();
    
    if(id==0)
    { 
        
        n=3;
        s="child";
    }
    else
    { 
        
        n=7;
        s="parent";
    }

    for(int i=0;i<n;i++)
    { 
        
        printf("s=%s,n=%d,&n=%x\n",s,n,&n);
        sleep(1);
    }

    exit(0);
}

结果

stu@stu-virtual-machine:~/Linux/day07$ ./fork
s=parent,n=7,&n=1fb1ad94
s=child,n=3,&n=1fb1ad94
s=parent,n=7,&n=1fb1ad94
s=child,n=3,&n=1fb1ad94
s=parent,n=7,&n=1fb1ad94
s=child,n=3,&n=1fb1ad94
s=parent,n=7,&n=1fb1ad94
s=parent,n=7,&n=1fb1ad94
s=parent,n=7,&n=1fb1ad94
s=parent,n=7,&n=1fb1ad94

标签: 2218连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台