什么是计算机系统
`计算机系统(A computer system)`
是由硬件和软件组成的,它们协同工作运行程序。不同的系统可能会有不同实现,但是核心概念是一样的,通用的。
不同的系统有 Microsoft Windows、Apple Mac OS X、Linux 等。
所有的计算机系统都有相似的软件和硬件组成,它们执行相似的功能。
你想要什么
首先,问你一个问题,你想成为哪种程序员?
这是我最近搜索到的一个很好的开源项目,它的路径是 https://github.com/keithnull/TeachYourselfCS-CN/blob/master/TeachYourselfCS-CN.md
也就是
我一直想成为第一种工程师,即使我永远成为不了,我也要越来越靠近它。
回到正题
没错,我就想成为一种`电脑程序员`
一段简单的程序
这次真的言归正传了,下面是一道很简单的 C 程序(不要管我的名字是
Java建设者还是什么,Java建设者就不能学习 C 了吗?虽然饭碗是 Java,但是 C
才是爸爸啊。)
#include <stdio.h> int main( ...
Linux 本身是没有图形化界面的,所谓的图形化界面系统只不过中 Linux
下的应用程序。这一点和 Windows 不一样。Windows 从 Windows 95
开始,图形界面就直接在系统内核中实现了,是操作系统不可或缺的一部分。Linux
的图形化界面,底层都是基于 X 协议。
X 协议由 X server 和 X client 组成: X server
管理主机上与显示相关的硬件设置(如显卡、硬盘、鼠标等),它负责屏幕画面的绘制与显示,以及将输入设置(如键盘、鼠标)的动作告知
X client。 X client (即 X 应用程序)
则主要负责事件的处理(即程序的逻辑)。
举个例子,如果用户点击了鼠标左键,因为鼠标归 X server 管理,于是 X
server 就捕捉到了鼠标点击这个动作,然后它将这个动作告诉 X client,因为 X
client 负责程序逻辑,于是 X client
就根据程序预先设定的逻辑(例如画一个圆),告诉 X server
说:“请在鼠标点击的位置,画一个圆”。最后,X server 就响应 X client
的请求,在鼠标点击的位置,绘 ...
许多时候 X server 和 X client 在同一台主机上,这看起来没什么。但是,
X server 和 X client 完全可以运行在不同的机器上,只要彼此通过 X
协议通信即可。
于是,我们就可以做一些“神奇”的事情,在本地显示 (X
server)运行在服务器上的 GUI 程序 (X client)。这样的操作可以通过 SSH X11
Forwarding 来实现。X11 中的 X 指的就是 X 协议,11 指的是采用 X 协议的第
11 个版本。
有了X11
Forwarding,通过SSH连接并运行Linux上有GUI的程序,就像是在Windows下运行GUI程序一样方便。很多时候,这样的机制可以方便有图形显示的程序的调试。但是要实现X11
Forwording,需要具备X
Server的SSH客户端,推荐使用MobaXTerm软件,默认就带X
Server程序,免费的非常好用。 X
Client部分,要安装一下软件包,要打开SSH的配置文件,将X11Forwarding修改为Yes。
安装X11-Forwarding
安装 X Window System
yum ...
用最简单的术语来说,API是应用程序编程接口(Application Programming
Interface)的缩写,它是一种软件中介,允许两个应用程序相互通信。
实际上,每次您在手机上查看天气,使用Facebook应用程序或发送即时消息时,您都在使用API。
每次您使用这些应用程序之一时,手机上的应用程序正在连接到Internet并将数据发送到服务器。
然后服务器检索数据,解释数据,执行必要的操作并发送它回到您的手机。
然后,应用程序解释该数据并以人类可读的格式为您提供所需的信息。
但是,API的真正作用是提供一层安全性。
因为您正在进行简洁明了的通话,则电话的数据永远不会完整暴露给服务器,同样,服务器也永远不会完全暴露给您的服务器电话。
而是每个人都与小数据包进行通信,共享只是必要的东西-就像您从驱动器上点菜一样。
多种类型的API
API有很多类型。例如,您可能听说过Java类中的API或接口,这些对象可以让对象在Java编程语言。除了以程序为中心的API,还有还有Web
API,例如简单对象访问协议(SOAP),远程过程调用(RPC),也许是最受欢迎的(至少在名称上)代表 ...
REST或RESTful
API设计(代表性状态转移)旨在利用现有协议。尽管REST几乎可以在任何协议上使用,但是当用于Web
API时,通常会利用HTTP。这意味着开发人员无需安装库或其他软件即可利用REST
API设计。REST API设计由Roy
Fielding博士在其2000年的博士学位论文中定义。它以其令人难以置信的灵活性而著称。由于数据不依赖于方法和资源,因此REST能够处理多种类型的调用,返回不同的数据格式,甚至可以通过正确实施超媒体来进行结构更改。
REST
API设计固有的自由度和灵活性使您可以构建既能满足您的需求又能满足非常多样化的客户需求的API。与SOAP不同,REST并不限于XML,而是可以返回XML,JSON,YAML或任何其他格式,具体取决于客户端的请求。而且与RPC不同,不需要用户按特定顺序知道过程名称或特定参数。
但是,REST
API设计存在一些缺点。您可能会失去在REST中(例如在会话中)维护状态的能力,并且较新的开发人员更难以使用。在构建API之前,了解使REST
API成为RESTful的原因以及为什么存在这些约束也很重要。毕竟,如果您不了 ...
并发程序和顺序程序的执行有本质上的差异,为了能更好地描述程序的并发执行,实现操作系统的并发性和共享性,引入“进程”的概念。
定义:进程还是具有一定独立功能的程序在某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。
从操作系统角度开,可将进程分为系统进程和用户进程两类。系统进程执行操作系统程序,完成操作系统的某些功能。用户进程运行用户程序,直接为用户服务。系统进程的优先级通常高于一般用户进程的优先级。
1.进程与程序的联系和区别
进程和程序既有联系又有区别。
(1)进程和程序的联系
程序是构成进程的组成部分之一,一个进程的运行目标是执行它所对应的程序,如果没有程序,进程就失去了其存在的意义。从静态的角度看,进程是由程序、数据和进程控制块(PCB)三部分组成的。
(2)进程和程序的区别 程序是静态的,而进程是动态的。
进程是程序的一个执行过程。程序的存在是永久的(这里不讨论人为删除程序等行为)。而进程是为了程序的一次执行而暂时存在的。进程有生命周期,有诞生,亦有消亡。
一个进程可以包括若干程序的执行,而一个程序亦可以产生多个进程。比如,一个编译进程在运行时就要执行词法 ...
进程在从创建到终止的全过程中一直处于一个不断变化的过程。为了刻画进程的这个变化过程,所有操作系统都把进程分成若干种状态,约定各种状态间的转换条件。对进程状态的刻画也经历了一个不断精确化的过程。下面我们就讨论进程的状态模型。
1.三状态进程模型
运行中的进程可以处于以下三种状态之一:运行、就绪、等待。
运行状态(Running)
是指进程已获得处理器,并且在处理器上执行的状态。显然,在一个单处理器系统中,最多只有一个进程处于运行态。2.
就绪状态(Ready)
是指一个进程已经具备运行条件,但由于没有获得处理器而不能运行所处的状态。一旦把处理器分配给它,该进程就可运行。处于就绪状态的进程可以是多个。3.
等待状态(Waiting)
也称阻塞状态或封锁状态。是指进程因等待某种事件发生而暂时不能运行的状态。例如,当两个进程竞争使用同一个资源时,没有占用该资源的进程便处于等待状态,它必须等到该资源被释放后才可以去使用它。引起等待的原因一旦消失,进程便转为就绪状态,以便在适当的时候投入运行。系统中处于等待状态的进程可以有多个。
在任何时刻,任何进程都处于且仅处于三种状态之一。进程在运行过程 ...
树莓派基金会今天发布了树莓派计算模块 4 代「Raspberry Pi Compute
Module 4」。共有 32 个具体型号,售价从 25 美元起。最低配置 1GB
RAM/Lite/无无线版本,25 美元;最高配置 8GB RAM/32GB Flash/无线增强版,90
美元。对应着 4 种不同的内存、4 种闪存容量和是否有无线通讯功能。
计算模块核心
CM4 核心模块配置如下:
博通 BCM2711 SoC 1.5GHz 4 核心 64-bit ARM Cortex-A72 CPU
VideoCore VI 图形,支持 OpenGL ES 3.x
H.265 (HEVC) 4Kp60 视频硬解码
H.264 (AVC) 视频 1080p60 硬解码和 1080p30 硬编码
双 HDMI 接口分辨率高达 4K
单通道 PCI Express 2.0 接口
双 MIPI DSI 显示器和双 MIPI CSI-2 摄像头接口
1GB, 2GB, 4GB 或 8GB LPDDR4-3200 SDRAM
可选 8GB, 16GB 或 32GB eMMC Flash 存储
可选 2 ...
多线程和并发性并不是什么新内容,但是 Java
语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言。核心类库包含一个
Thread 类,可以用它来构建、启动和操纵线程,Java
语言包括了跨线程传达并发性约束的构造 —— synchronized 和 volatile
。在简化与平台无关的并发类的开发的同时,它决没有使并发类的编写工作变得更繁琐,只是使它变得更容易了。
synchronized 快速回顾
把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有
**原子性(atomicity)**和
可见性(visibility)。原子性意味着一个线程一次只能执行由一个指定监控对象(lock)保护的代码,从而防止多个线程在更新共享状态时相互冲突。可见性则更为微妙;它要对付内存缓存和编译器优化的各种反常行为。
一般来说,线程以某种不必让其他线程立即可以看到的方式(不管这些线程在寄存器中、在处理器特定的缓存中,还是通过指令重排或者其他编译器优化),不受缓存变量值的约束,但是如果开发人员使用了同步,如下面的代码所示,那么运行库将 ...
问题前景
了解线程安全的之前先来了解一下 Java
的内存模型,先搞清楚线程是怎么工作的。
Java 内存模型 - JMM
什么是 JMM
JMM(Java Memory
Model),是一种基于计算机内存模型(定义了共享内存系统中多线程程序读写操作行为的规范),屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范。保证共享内存的原子性、可见性、有序性。
那么问题来了,线程工作内存怎么知道什么时候又是怎样将数据同步到主内存呢?
这里就轮到 JMM 出场了。 JMM
规定了何时以及如何做线程工作内存与主内存之间的数据同步。 对 JMM
有了初步的了解,简单总结一下原子性、可见性、有序性。
**原子性:**对共享内存的操作必须是要么全部执行直到执行结束,且中间过程不能被任何外部因素打断,要么就不执行。
**可见性:**多线程操作共享内存时,执行结果能够及时的同步到共享内存,确保其他线程对此结果及时可见。
**有序性:**程序的执行顺序按照代码顺序执行,在单线程环境下,程序的执行都是有序的,但是在多线程环境下,JMM
为了性能优化,编 ...
