Computer data storage
Computer data storage called storage or memory, is a technology consisting of computer components and recording media that are used to retain digital data. It is a core function and fundamental component of computers; the central processing unit of a computer is. In practice all computers use a storage hierarchy, which puts fast but expensive and small storage options close to the CPU and slower but larger and cheaper options farther away; the fast volatile technologies are referred to as "memory", while slower persistent technologies are referred to as "storage". In the Von Neumann architecture, the CPU consists of two main parts: The control unit and the arithmetic logic unit; the former controls the flow of data between the CPU and memory, while the latter performs arithmetic and logical operations on data. Without a significant amount of memory, a computer would be able to perform fixed operations and output the result, it would have to be reconfigured to change its behavior. This is acceptable for devices such as desk calculators, digital signal processors, other specialized devices.
Von Neumann machines differ in having a memory in which they store their operating instructions and data. Such computers are more versatile in that they do not need to have their hardware reconfigured for each new program, but can be reprogrammed with new in-memory instructions. Most modern computers are von Neumann machines. A modern digital computer represents data using the binary numeral system. Text, pictures and nearly any other form of information can be converted into a string of bits, or binary digits, each of which has a value of 1 or 0; the most common unit of storage is the byte, equal to 8 bits. A piece of information can be handled by any computer or device whose storage space is large enough to accommodate the binary representation of the piece of information, or data. For example, the complete works of Shakespeare, about 1250 pages in print, can be stored in about five megabytes with one byte per character. Data are encoded by assigning a bit pattern to digit, or multimedia object.
Many standards exist for encoding. By adding bits to each encoded unit, redundancy allows the computer to both detect errors in coded data and correct them based on mathematical algorithms. Errors occur in low probabilities due to random bit value flipping, or "physical bit fatigue", loss of the physical bit in storage of its ability to maintain a distinguishable value, or due to errors in inter or intra-computer communication. A random bit flip is corrected upon detection. A bit, or a group of malfunctioning physical bits is automatically fenced-out, taken out of use by the device, replaced with another functioning equivalent group in the device, where the corrected bit values are restored; the cyclic redundancy check method is used in communications and storage for error detection. A detected error is retried. Data compression methods allow in many cases to represent a string of bits by a shorter bit string and reconstruct the original string when needed; this utilizes less storage for many types of data at the cost of more computation.
Analysis of trade-off between storage cost saving and costs of related computations and possible delays in data availability is done before deciding whether to keep certain data compressed or not. For security reasons certain types of data may be kept encrypted in storage to prevent the possibility of unauthorized information reconstruction from chunks of storage snapshots; the lower a storage is in the hierarchy, the lesser its bandwidth and the greater its access latency is from the CPU. This traditional division of storage to primary, secondary and off-line storage is guided by cost per bit. In contemporary usage, "memory" is semiconductor storage read-write random-access memory DRAM or other forms of fast but temporary storage. "Storage" consists of storage devices and their media not directly accessible by the CPU hard disk drives, optical disc drives, other devices slower than RAM but non-volatile. Memory has been called core memory, main memory, real storage or internal memory. Meanwhile, non-volatile storage devices have been referred to as secondary storage, external memory or auxiliary/peripheral storage.
Primary storage referred to as memory, is the only one directly accessible to the CPU. The CPU continuously reads instructions executes them as required. Any data operated on is stored there in uniform manner. Early computers used delay lines, Williams tubes, or rotating magnetic drums as primary storage. By 1954, those unreliable methods were replaced by magnetic core memory. Core memory remained dominant until the 1970s, when advances in integrated circuit technology allowed semiconductor memory to become economically competitive; this led to modern random-access memo
Machine code is a computer program written in machine language instructions that can be executed directly by a computer's central processing unit. Each instruction causes the CPU to perform a specific task, such as a load, a store, a jump, or an ALU operation on one or more units of data in CPU registers or memory. Machine code is a numerical language, intended to run as fast as possible, may be regarded as the lowest-level representation of a compiled or assembled computer program or as a primitive and hardware-dependent programming language. While it is possible to write programs directly in machine code, it is tedious and error prone to manage individual bits and calculate numerical addresses and constants manually. For this reason, programs are rarely written directly in machine code in modern contexts, but may be done for low level debugging, program patching, assembly language disassembly; the overwhelming majority of practical programs today are written in higher-level languages or assembly language.
The source code is translated to executable machine code by utilities such as compilers and linkers, with the important exception of interpreted programs, which are not translated into machine code. However, the interpreter itself, which may be seen as an executor or processor, performing the instructions of the source code consists of directly executable machine code. Machine code is by definition the lowest level of programming detail visible to the programmer, but internally many processors use microcode or optimise and transform machine code instructions into sequences of micro-ops, this is not considered to be a machine code per se; every processor or processor family has its own instruction set. Instructions are patterns of bits that by physical design correspond to different commands to the machine. Thus, the instruction set is specific to a class of processors using the same architecture. Successor or derivative processor designs include all the instructions of a predecessor and may add additional instructions.
A successor design will discontinue or alter the meaning of some instruction code, affecting code compatibility to some extent. Systems may differ in other details, such as memory arrangement, operating systems, or peripheral devices; because a program relies on such factors, different systems will not run the same machine code when the same type of processor is used. A processor's instruction set may have all instructions of the same length, or it may have variable-length instructions. How the patterns are organized varies with the particular architecture and also with the type of instruction. Most instructions have one or more opcode fields which specifies the basic instruction type and the actual operation and other fields that may give the type of the operand, the addressing mode, the addressing offset or index, or the actual value itself. Not all machines or individual instructions have explicit operands. An accumulator machine has a combined left operand and result in an implicit accumulator for most arithmetic instructions.
Other architectures have accumulator versions of common instructions, with the accumulator regarded as one of the general registers by longer instructions. A stack machine has all of its operands on an implicit stack. Special purpose instructions often lack explicit operands; this distinction between explicit and implicit operands is important in code generators in the register allocation and live range tracking parts. A good code optimizer can track implicit as well as explicit operands which may allow more frequent constant propagation, constant folding of registers and other code enhancements. A computer program is a list of instructions. A program's execution is done in order for the CPU, executing it to solve a specific problem and thus accomplish a specific result. While simple processors are able to execute instructions one after another, superscalar processors are capable of executing a variety of different instructions at once. Program flow may be influenced by special'jump' instructions that transfer execution to an instruction other than the numerically following one.
Conditional jumps are not depending on some condition. A much more readable rendition of machine language, called assembly language, uses mnemonic codes to refer to machine code instructions, rather than using the instructions' numeric values directly. For example, on the Zilog Z80 processor, the machine code 00000101, which causes the CPU to decrement the B processor register, would be represented in assembly language as DEC B; the MIPS architecture provides a specific example for a machine code whose instructions are always 32 bits long. The general type of instruction is given by the op field. J-type and I-type instructions are specified by op. R-type instructions include an additional field funct to determine the exact operation; the fields used in the
Oracle Corporation is an American multinational computer technology corporation headquartered in Redwood Shores, California. The company specializes in developing and marketing database software and technology, cloud engineered systems, enterprise software products — its own brands of database management systems. In 2018, Oracle was the third-largest software maker by revenue, after Alphabet; the company develops and builds tools for database development and systems of middle-tier software, enterprise resource planning software, customer relationship management software, supply chain management software. Larry Ellison co-founded Oracle Corporation in 1977 with Bob Miner and Ed Oates under the name Software Development Laboratories. Ellison took inspiration from the 1970 paper written by Edgar F. Codd on relational database management systems named "A Relational Model of Data for Large Shared Data Banks." He heard about the IBM System R database from an article in the IBM Research Journal provided by Oates.
Ellison wanted to make Oracle's product compatible with System R, but failed to do so as IBM kept the error codes for their DBMS a secret. SDL changed its name to Relational Software, Inc in 1979 again to Oracle Systems Corporation in 1982, to align itself more with its flagship product Oracle Database. At this stage Bob Miner served as the company's senior programmer. On March 12, 1986, the company had its initial public offering. In 1995, Oracle Systems Corporation changed its name to Oracle Corporation named Oracle, but sometimes referred to as Oracle Corporation, the name of the holding company. Part of Oracle Corporation's early success arose from using the C programming language to implement its products; this eased porting to different operating systems. 1979: offers the first commercial SQL RDBMS 1983: offers a VAX-mode database 1984: offers the first database with read-consistency 1986: offers a client-server DBMS 1987: introduces UNIX-based Oracle applications 1988: introduces PL/SQL.
1992: offers full applications implementation methodology 1995: offers the first 64-bit RDBMS 1996: moves towards an open standards-based, web-enabled architecture 1999: offers its first DBMS with XML support 2001: becomes the first to complete 3 terabyte TPC-H world record 2002: offers the first database to pass 15 industry standard security evaluations 2003: introduces what it calls "Enterprise Grid Computing" with Oracle10g 2005: releases its first free database, Oracle Database 10g Express Edition 2006: acquires Siebel Systems 2007: acquires Hyperion Solutions 2008: Smart scans in software improve query-response in HP Oracle Database Machine / Exadata storage 2010: acquires Sun Microsystems 2013: begins use of Oracle 12c, capable of providing cloud services with Oracle Database 2014: acquires Micros Systems 2016: acquires NetSuite Inc. Oracle ranked No. 82 in the 2018 Fortune 500 list of the largest United States corporations by total revenue. According to Bloomberg, Oracle's CEO-to-employee pay ratio is 1,205:1.
The CEO's compensation in 2017 was $108,295,023. Meanwhile, the median employee compensation rate was $89,887. Oracle designs and sells both software and hardware products, as well as offering services that complement them. Many of the products have been added to Oracle's portfolio through acquisitions. Oracle's E-delivery service provides documentation. Oracle Database Release 10: In 2004, Oracle Corporation shipped release 10g as the latest version of Oracle Database. Release 11: Release 11g became the current Oracle Database version in 2007. Oracle Corporation released Oracle Database 11g Release 2 in September 2009; this version was available in four commercial editions—Enterprise Edition, Standard Edition, Standard Edition One, Personal Edition—and in one free edition—the Express Edition. The licensing of these editions shows various restrictions and obligations that were called complex by licensing expert Freirich Florea; the Enterprise Edition, the most expensive of the Database Editions, has the fewest restrictions — but has complex licensing.
Oracle Corporation constrains the Standard Edition and Standard Edition One with more licensing restrictions, in accordance with their lower price. Release 12: Release 12c became available on July 1, 2013. Oracle Corporation has acquired and developed the following additional database technologies: Berkeley DB, which offers embedded database processing Oracle Rdb, a relational database system running on OpenVMS platforms. Oracle acquired Rdb in 1994 from Digital Equipment Corporation. Oracle has since made many enhancements to this product and development continues as of 2008. TimesTen, which features in-memory database operations Oracle Essbase, which continues the Hyperion Essbase tradition of multi-dimensional database management MySQL, a relational database management system licensed under the GNU General Public License developed by MySQL AB Oracle NoSQL Database, a scalable, distributed key-value NoSQL database Oracle Fusion Middleware is a family of middleware
In computing, an address space defines a range of discrete addresses, each of which may correspond to a network host, peripheral device, disk sector, a memory cell or other logical or physical entity. For software programs to save and retrieve stored data, each unit of data must have an address where it can be individually located or else the program will be unable to find and manipulate the data; the number of address spaces available will depend on the underlying address structure and these will be limited by the computer architecture being used. Address spaces are created by combining enough uniquely identified qualifiers to make an address unambiguous within the address space. For a person's physical address, the address space would be a combination of locations, such as a neighborhood, city, or country; some elements of an address space may be the same, but if any element in the address is different addresses in said space will reference different entities. An example could be that there are multiple buildings at the same address of "32 Main Street" but in different towns, demonstrating that different towns have different, although arranged, street address spaces.
An address space provides a partitioning to several regions according to the mathematical structure it has. In the case of total order, as for memory addresses, these are chunks; some nested domain hierarchies appear in the case of directed ordered tree as for the Domain Name System or a directory structure. In the Internet, for example, the Internet Assigned Numbers Authority allocates ranges of IP addresses to various registries in order to enable them to each manage their parts of the global Internet address space. Uses of addresses include, but are not limited to the following: Memory addresses for main memory, memory-mapped I/O, as well as for virtual memory. Another common feature of address spaces are mappings and translations forming numerous layers; this means that some higher-level address must be translated to lower-level ones in some way. For example, file system on a logical disk operates linear sector numbers, which have to be translated to absolute LBA sector addresses, in simple cases, via addition of the partition's first sector address.
For a disk drive connected via Parallel ATA, each of them must be converted to logical cylinder-head-sector address due to the interface historical shortcomings. It is converted back to LBA by the disk controller and finally, to physical cylinder and sector numbers; the Domain Name System maps its names to network-specific addresses, which in turn may be mapped to link layer network addresses via Address Resolution Protocol. Network address translation may occur on the edge of different IP spaces, such as a local area network and the Internet. An iconic example of virtual-to-physical address translation is virtual memory, where different pages of virtual address space map either to page file or to main memory physical address space, it is possible that several numerically different virtual addresses all refer to one physical address and hence to the same physical byte of RAM. It is possible that a single virtual address maps to zero, one, or more than one physical address. Linear address space Name space Virtualization
Synchronization (computer science)
In computer science, synchronization refers to one of two distinct but related concepts: synchronization of processes, synchronization of data. Process synchronization refers to the idea that multiple processes are to join up or handshake at a certain point, in order to reach an agreement or commit to a certain sequence of action. Data synchronization refers to the idea of keeping multiple copies of a dataset in coherence with one another, or to maintain data integrity. Process synchronization primitives are used to implement data synchronization; the need for synchronization does not arise in multi-processor systems but for any kind of concurrent processes. Mentioned below are some of the main needs for synchronization: Forks and Joins: When a job arrives at a fork point, it is split into N sub-jobs which are serviced by n tasks. After being serviced, each sub-job waits, they are joined again and leave the system. Thus, in parallel programming, we require synchronization as all the parallel processes wait for several other processes to occur.
Producer-Consumer: In a producer-consumer relationship, the consumer process is dependent on the producer process till the necessary data has been produced. Exclusive use resources: When multiple processes are dependent on a resource and they need to access it at the same time the operating system needs to ensure that only one processor accesses it at a given point in time; this reduces concurrency. Thread synchronization is defined as a mechanism which ensures that two or more concurrent processes or threads do not execute some particular program segment known as critical section. Processes' access to critical section is controlled by using synchronization techniques; when one thread starts executing the critical section the other thread should wait until the first thread finishes. If proper synchronization techniques are not applied, it may cause a race condition where the values of variables may be unpredictable and vary depending on the timings of context switches of the processes or threads.
For example, suppose that there are three processes, namely 1, 2, 3. All three of them are concurrently executing, they need to share a common resource as shown in Figure 1. Synchronization should be used here to avoid any conflicts for accessing this shared resource. Hence, when Process 1 and 2 both try to access that resource, it should be assigned to only one process at a time. If it is assigned to Process 1, the other process needs to wait. Another synchronization requirement which needs to be considered is the order in which particular processes or threads should be executed. For example, we can not board a plane. We cannot check e-mails without validating our credentials. In the same way, an ATM will not provide any service until we provide it with a correct PIN. Other than mutual exclusion, synchronization deals with the following: deadlock, which occurs when many processes are waiting for a shared resource, being held by some other process. In this case, the processes just execute no further.
This violation of priority rules can happen under certain circumstances and may lead to serious consequences in real-time systems. This frequent polling robs processing time from other processes. One of the challenges for exascale algorithm design is to reduce synchronization. Synchronization takes more time than computation in distributed computing. Reducing synchronization drew attention from computer scientists for decades. Whereas it becomes an significant problem as the gap between the improvement of computing and latency increases. Experiments have shown that communications due to synchronization on a distributed computers takes a dominated share in a sparse iterative solver; this problem is receiving increasing attention after the emergence of a new benchmark metric, the High Performance Conjugate Gradient, for ranking the top 500 supercomputers. The following are some classic problems of synchronization: The Producer–Consumer Problem; these problems are used to test nearly every newly proposed synchronization scheme.
Many systems provide hardware support for critical section code. A single processor or uniprocessor system could disable interrupts by executing running code without preemption, inefficient on multiprocessor systems. "The key ability we require to implement synchronization in a multiprocessor is a set of hardware primitives with the ability to atomically read and modify a memory location. Without such a capability, the cost of building basic synchronization primitives will be too high and will increase as the processor count increases. There are a number of alternative formulations of the basic hardware primitives, all of which provide the ability to atomically read and modify a location, together with some way to tell if the read and write were performed atomically; these hardware primitives are the basic building blocks that are used to bui
Computer programming is the process of designing and building an executable computer program for accomplishing a specific computing task. Programming involves tasks such as: analysis, generating algorithms, profiling algorithms' accuracy and resource consumption, the implementation of algorithms in a chosen programming language; the source code of a program is written in one or more languages that are intelligible to programmers, rather than machine code, directly executed by the central processing unit. The purpose of programming is to find a sequence of instructions that will automate the performance of a task on a computer for solving a given problem; the process of programming thus requires expertise in several different subjects, including knowledge of the application domain, specialized algorithms, formal logic. Tasks accompanying and related to programming include: testing, source code maintenance, implementation of build systems, management of derived artifacts, such as the machine code of computer programs.
These might be considered part of the programming process, but the term software development is used for this larger process with the term programming, implementation, or coding reserved for the actual writing of code. Software engineering combines engineering techniques with software development practices. Reverse engineering is the opposite process. A hacker is any skilled computer expert that uses their technical knowledge to overcome a problem, but it can mean a security hacker in common language. Programmable devices have existed at least as far back as 1206 AD, when the automata of Al-Jazari were programmable, via pegs and cams, to play various rhythms and drum patterns. However, the first computer program is dated to 1843, when mathematician Ada Lovelace published an algorithm to calculate a sequence of Bernoulli numbers, intended to be carried out by Charles Babbage's Analytical Engine. Women would continue to dominate the field of computer programming until the mid 1960s. In the 1880s Herman Hollerith invented the concept of storing data in machine-readable form.
A control panel added to his 1906 Type I Tabulator allowed it to be programmed for different jobs, by the late 1940s, unit record equipment such as the IBM 602 and IBM 604, were programmed by control panels in a similar way. However, with the concept of the stored-program computers introduced in 1949, both programs and data were stored and manipulated in the same way in computer memory. Machine code was the language of early programs, written in the instruction set of the particular machine in binary notation. Assembly languages were soon developed that let the programmer specify instruction in a text format, with abbreviations for each operation code and meaningful names for specifying addresses. However, because an assembly language is little more than a different notation for a machine language, any two machines with different instruction sets have different assembly languages. Kathleen Booth created one of the first Assembly languages in 1950 for various computers at Birkbeck College. High-level languages allow the programmer to write programs in terms that are syntactically richer, more capable of abstracting the code, making it targetable to varying machine instruction sets via compilation declarations and heuristics.
The first compiler for a programming language was developed by Grace Hopper. When Hopper went to work on UNIVAC in 1949, she brought the idea of using compilers with her. Compilers harness the power of computers to make programming easier by allowing programmers to specify calculations by entering a formula using infix notation for example. FORTRAN, the first used high-level language to have a functional implementation which permitted the abstraction of reusable blocks of code, came out in 1957. In 1951 Frances E. Holberton developed the first sort-merge generator which ran on the UNIVAC I. Another woman working at UNIVAC, Adele Mildred Koss, developed a program, a precursor to report generators. In USSR, Kateryna Yushchenko developed the Address programming language for the MESM in 1955; the idea for the creation of COBOL started in 1959 when Mary K. Hawes, who worked for Burroughs Corporation, set up a meeting to discuss creating a common business language, she invited six people, including Grace Hopper.
Hopper was involved in developing COBOL as a business language and creating "self-documenting" programming. Hopper's contribution to COBOL was based on her programming language, called FLOW-MATIC. In 1961, Jean E. Sammet developed FORMAC and published Programming Languages: History and Fundamentals which went on to be a standard work on programming languages. Programs were still entered using punched cards or paper tape. See computer programming in the punch card era. By the late 1960s, data storage devices and computer terminals became inexpensive enough that programs could be created by typing directly into the computers. Frances Holberton created a code to allow keyboard inputs while she worked at UNIVAC. Text editors were developed that allowed changes and corrections to be made much more than with punched cards. Sister Mary Kenneth Keller worked on developing the programming language, BASIC when she was a graduate student at Dartmouth in the 1960s. One of the first object-oriented programming languages, was developed by seven programmers, including Adele Goldberg, in the 1970s.
In 1985, Radia Perlman developed the Spannin